package org.abc.fund.dto.combination; // 建议放在一个新的 util 或 converter 包

import org.abc.fund.entity.combination.CombinationHolding;
import org.abc.fund.entity.combination.CombinationProduct;

import java.util.List;
import java.util.stream.Collectors;

public class CombinationConverter {

    /**
     * 将 CombinationProduct 实体转换为用于列表展示的 DTO
     */
    public static CombinationProductDTO toProductDTO(CombinationProduct product) {
        if (product == null) {
            return null;
        }
        CombinationProductDTO dto = new CombinationProductDTO();
        dto.setId(product.getId());
        dto.setName(product.getName());
        dto.setRiskLevel(product.getRiskLevel());
        dto.setStatus(String.valueOf(product.getStatus()));
        dto.setCreateTime(product.getCreateTime());
        dto.setUpdateTime(product.getUpdateTime());
        return dto;
    }

    /**
     * 将 CombinationProduct 实体转换为包含完整信息的 DTO
     */
    public static CombinationDetailDTO toProductDetailDTO(CombinationProduct product) {
        if (product == null) {
            return null;
        }
        CombinationDetailDTO dto = new CombinationDetailDTO();
        dto.setId(product.getId());
        dto.setName(product.getName());
        dto.setRiskLevel(product.getRiskLevel());
        dto.setStrategy(product.getStrategy());
        dto.setFeatures(product.getFeatures());
        dto.setStatus(String.valueOf(product.getStatus()));
        dto.setCreatorId(product.getCreatorId());
        // 转换持仓列表
        if (product.getHoldings() != null) {
            dto.setHoldings(product.getHoldings().stream()
                    .map(CombinationConverter::toHoldingDTO)
                    .collect(Collectors.toList()));
        }
        return dto;
    }

    /**
     * 将 CombinationHolding 实体转换为 DTO
     */
    public static CombinationHoldingDTO toHoldingDTO(CombinationHolding holding) {
        if (holding == null) {
            return null;
        }
        CombinationHoldingDTO dto = new CombinationHoldingDTO();
        dto.setFundCode(holding.getFundCode());
        return dto;
    }

    /**
     * 将包含完整信息的 DTO 转换为 CombinationProduct 实体 (用于创建/更新)
     */
    public static CombinationProduct toProductEntity(CombinationDetailDTO dto) {
        if (dto == null) {
            return null;
        }
        CombinationProduct product = new CombinationProduct();
        product.setId(dto.getId());
        product.setName(dto.getName());
        product.setRiskLevel(dto.getRiskLevel());
        product.setStrategy(dto.getStrategy());
        product.setFeatures(dto.getFeatures());
        product.setStatus(CombinationProduct.Status.valueOf(dto.getStatus() != null ? dto.getStatus() : "DRAFT"));
        product.setCreatorId(dto.getCreatorId());

        // 转换持仓列表
        if (dto.getHoldings() != null) {
            List<CombinationHolding> holdings = dto.getHoldings().stream()
                    .map(hDto -> toHoldingEntity(hDto, product))
                    .collect(Collectors.toList());
            product.setHoldings(holdings);
        }
        return product;
    }

    /**
     * 将持仓 DTO 转换为 CombinationHolding 实体
     */
    public static CombinationHolding toHoldingEntity(CombinationHoldingDTO dto, CombinationProduct product) {
        if (dto == null) {
            return null;
        }
        CombinationHolding holding = new CombinationHolding();
        holding.setFundCode(dto.getFundCode());
        holding.setPercentage(dto.getTargetRatio());
        holding.setCombinationProduct(product); // 设置反向引用
        return holding;
    }
}